﻿Imports System.Windows.Forms
Imports PTIC_GestionBDD
Imports PTIC_Util

Public Class DlgVisuCorresp

#Region "Variables de classe"

    'Variable métier - Caractérise la correspondance consultée
    Protected _table As tableBDD
    Protected _typMapping As typeMapping
    Protected _correspConsultee As Correspondance

    'Variables utilitaires - Permettent de gérer l'activation des prises en charge lors de modifications
    'de textBox / comboBox
    Protected precValeurCurseurTxtBox As Integer
    Protected precValeurTxtBox As String
    Protected MAJ_TextChanged As Boolean

    Protected _chEntreeCorrespSAVE As ChampsBDD
    Protected _txt_chConstant_TextChangedActive As Boolean
    Protected _txt_chConstant_DerniereValeurValide As String
    Protected _txt_chConstant_DernierePosCurseurValide As Integer

#End Region

#Region "Constructeur"

    Public Sub New(ByVal table As tableBDD, ByVal typMapping As typeMapping, ByVal descrCorresp As String)

        ' Cet appel est requis par le Concepteur Windows Form.
        InitializeComponent()

        'Initialisation des variables métier
        _table = table
        _typMapping = typMapping
        _correspConsultee = table.mapping(typMapping).Item(descrCorresp)
        If Not _correspConsultee.chBDD Is Nothing Then
            _chEntreeCorrespSAVE = _correspConsultee.chBDD.copy()
        Else
            _chEntreeCorrespSAVE = Nothing
        End If


        'Initialisation des variables utiles à l'affichage
        _txt_chConstant_TextChangedActive = False
        _txt_chConstant_DerniereValeurValide = ""
        MAJ_TextChanged = True
        precValeurCurseurTxtBox = 1
        precValeurTxtBox = ""

        'Initialisation de la combo indiquant la possibilité ou non de retenir la correspondance
        'comme variable de segmentation
        If _correspConsultee.possSeg Then
            cbx_PossSegment.SelectedItem = "Oui"
        Else
            cbx_PossSegment.SelectedItem = "Non"
        End If

        'Remplissage des caractéristiques du champs en sortie
        lbl_descCible.Text = _correspConsultee.description
        lbl_FormatCible.Text = _correspConsultee.chOutil.getFormat.typeStock().Name


        'Remplissage des caractéristiques du champs en entrée + Informat.
        'Ce remplissage est différent selon que le champs en entrée est vide/constant ou égale
        'à une variable de la base
        If Not _correspConsultee.chBDD Is Nothing Then

            If _correspConsultee.typeChEntree = DefinitionsTypes.typeChEntreeMapping.TABLE Then

                'Initialisation de la cbx Informat
                cbx_inFormat.Items.Clear()
                For Each nomInformat As String In _correspConsultee.informat.getNomsInformatPoss()
                    cbx_inFormat.Items.Add(nomInformat)
                Next
                cbx_inFormat.SelectedItem = _correspConsultee.informat.nom

                'Caractéristiques du champs en entrée
                lbl_NomSource.Text = _correspConsultee.chBDD.Nom
                lbl_SceFormatStock.Text = _correspConsultee.chBDD.getFormat.typeStock.Name
                lbl_SceFormatAff.Text = _correspConsultee.chBDD.getFormat.typeAff.Name

            Else

                'Le champs en entrée de la correspondance est un champs constant
                lbl_NomSource.Text = "-"
                lbl_SceFormatStock.Text = "-"
                lbl_SceFormatAff.Text = "-"
                Txt_chConstant.Text = "='" & _correspConsultee.chBDD.Nom & "'"

            End If

        Else

            'Le champs en entrée de la correspondance n'est pas renseigné
            lbl_NomSource.Text = "-"
            lbl_SceFormatStock.Text = "-"
            lbl_SceFormatAff.Text = "-"

        End If

        'Remplissage des valeurs attendues de la correspondance
        ltv_valEncCible.Columns.Item(0).Text = _correspConsultee.description
        'Si des contraintes sont présentes sur la correspondance, mise à jour de la listview correspondante
        If Not (_correspConsultee.getContraintesVal Is Nothing) Then
            remplit_lstV_from_ddtTable(ltv_valEncCible, _correspConsultee.getContraintesVal)
        End If


        'Remplissage des valeurs prises par la correspondance (après application de l'informat)
        ltv_ValeursEncSce.Columns.Item(0).Text = _correspConsultee.description
        If Not _correspConsultee.chBDD Is Nothing Then
            If Not _correspConsultee.chOutil.valeursDistinctes Is Nothing Then
                remplit_lstV_from_ddtTable(ltv_ValeursEncSce, _correspConsultee.chOutil.valeursDistinctes)
            End If
        End If

        MAJ_affichageCorresp()

        'Mise à jour des variables utiles pour l'affichage
        _txt_chConstant_TextChangedActive = True

        ''lbl_NomChSource1.ForeColor = Color.FromArgb(20, 7, 27)

    End Sub

#End Region

#Region "Méthodes de classe"

#Region "Méthodes - gestion des comboBox (infomat + possibilité de segmentation)"

    Private Sub cbx_PossSegment_SelectedValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cbx_PossSegment.SelectedValueChanged
        If cbx_PossSegment.SelectedItem = "Oui" Then
            _correspConsultee.possSeg = True
        Else
            _correspConsultee.possSeg = False
        End If
    End Sub
    Private Sub cbx_inFormat_SelectedValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cbx_inFormat.SelectedValueChanged
        _correspConsultee.informat.nom = cbx_inFormat.SelectedItem
    End Sub

#End Region

#Region "Méthodes - Rafraichissement de l'affichage"

    'Rafraichissement de l'affichage en cours de paramétrage
    '   - Activation / désactivation de contrôles par rapport au type de champs en entrée 
    '   - MAJ de la zone de commentaire 
    '   - MAJ de la couleur de la correspondance
    Private Sub MAJ_affichageCorresp()

        'Activation / désactivation des contrôles selon le type de champs en entrée
        If Not _correspConsultee.chBDD Is Nothing Then
            If _correspConsultee.typeChEntree = typeChEntreeMapping.CONSTANT Then
                ''gbx_champsSource.Enabled = False
                cbx_inFormat.Enabled = False
                ''lbl_chSourceValeurs.Enabled = False
                ltv_ValeursEncSce.Enabled = False
            Else
                gbx_champsSource.Enabled = True
                lbl_chSourceValeurs.Enabled = True
                ltv_ValeursEncSce.Enabled = True
            End If
        Else
            ''gbx_champsSource.Enabled = False
            ''lbl_chSourceValeurs.Enabled = False
            ltv_ValeursEncSce.Enabled = False
            cbx_inFormat.Enabled = False
        End If

        'Remplissage de la zone de commentaires
        If _correspConsultee.commentaire <> "OK" Then
            Me.Height = 642
            lbl_RqCorresp.Visible = True
            lbl_RqCorresp_Text.Visible = True
            lbl_RqCorresp_Text.Text = _correspConsultee.commentaire
        Else
            Me.Height = 493
            lbl_RqCorresp.Visible = False
            lbl_RqCorresp_Text.Visible = False
        End If

        'Couleur de la correspondance
        Me.btn_CouleurCorresp.BackColor = _correspConsultee.etat

    End Sub

#End Region

#Region "Méthodes - Gestion txtBox des valeurs constantes"

    'On envoie un masque en paramètre, la fonction renvoie VRAI
    'si le masque est valide et 0 sinon
    Private Function setValeurMasque(ByVal nveauMasque As String)

        'Cette grandeur prend la valeur vraie si les changements sont réalisés
        Dim result As Boolean = True
        Dim nvelleValeur As String = ""

        'Si la nouvelle valeur du champs constant est non vide
        If nveauMasque <> "" Then

            'Si le masque de saisie était précédemment vide, on l'initialise
            If _txt_chConstant_DerniereValeurValide = "" Then
                If _correspConsultee.chOutil.getFormat.typeStock.Name = "String" Then
                    'On teste le 1er caractère pour voir s'il est égal à "="
                    If Microsoft.VisualBasic.Left(nveauMasque, 1) <> "=" Then nveauMasque = "=" & nveauMasque
                    If nveauMasque(1) <> "'" Then nveauMasque = "='" & Microsoft.VisualBasic.Mid(nveauMasque, 2)
                    If nveauMasque(nveauMasque.Length - 1) <> "'" Then nveauMasque = nveauMasque & "'"
                End If
                If _correspConsultee.chOutil.getFormat.typeStock.Name = "Decimal" Then
                    'On teste le 1er caractère pour voir s'il est égal à "="
                    If Microsoft.VisualBasic.Left(nveauMasque, 1) <> "=" Then nveauMasque = "=" & nveauMasque
                End If
            End If

            'On vérifie que le "=" et les "'" sont toujours présents dans le nouveau masque
            If _correspConsultee.chOutil.getFormat.typeStock.Name = "String" Then
                If (Microsoft.VisualBasic.Left(nveauMasque, 2) <> "='" Or _
                    Microsoft.VisualBasic.Right(nveauMasque, 1) <> "'" Or _
                    Len(nveauMasque) < 3) Then
                    result = False
                End If
            End If
            If _correspConsultee.chOutil.getFormat.typeStock.Name = "Decimal" Then
                If (Microsoft.VisualBasic.Left(nveauMasque, 1) <> "=") Then
                    result = False
                End If
            End If

            'Affectation de la valeur formatée au champs source


            'On vérifie que la valeur demandée pour la mise à jour est conforme
            'conforme au type du champs cible. A ce stade, on a un masque de saisie formaté. On peut donc récupérer la valeurs
            'demandée dans nvelleValeur
            ''If result Then
            ''nvelleValeur = valeurDepuisMasque(nveauMasque)
            'Pour les formats numériques, vérifier que la valeur est compatible
            ''If (Not IsNumeric(nvelleValeur) And _format = "Decimal") Then result = False
            ''End If

            ''If result Then
            ''_valeurMasque = nveauMasque
            ''_valeur = nvelleValeur
            ''End If

        Else


            ''_valeurMasque = Nothing
            ''_valeur = Nothing
            ''result = True

        End If

        Return result

    End Function

    Private Sub Txt_chConstant_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) _
        Handles Txt_chConstant.TextChanged

        'Si la prise en compte des modifications de la textBox est active
        If _txt_chConstant_TextChangedActive Then

            'Result prend la valeur vraie si les changements depuis la dernière valeure valide de
            'de la textBox sont valides / peuvent être effectués
            Dim result As Boolean = True
            Dim nvelleValeurTxtBoxCst As String = Txt_chConstant.Text
            Dim nvelleValeurCst As String = ""

            'Si la textBox des valeurs constantes n'est pas vide
            If Txt_chConstant.Text <> "" Then

                'Si le masque de saisie était précédemment vide, on l'initialise
                If _txt_chConstant_DerniereValeurValide = "" Then
                    'Champs en sortie de type String
                    If _correspConsultee.chOutil.getFormat.typeStock.Name = "String" Then
                        'Test du 1er caractère pour voir s'il est égal à "=" + ajustement si nécessaire
                        If Microsoft.VisualBasic.Left(nvelleValeurTxtBoxCst, 1) <> "=" Then nvelleValeurTxtBoxCst = "=" & nvelleValeurTxtBoxCst
                        'Test du 2eme caractère pour voir s'il est égal à "'" + ajustement si nécessaire
                        If nvelleValeurTxtBoxCst(1) <> "'" Then nvelleValeurTxtBoxCst = "='" & Microsoft.VisualBasic.Mid(nvelleValeurTxtBoxCst, 2)
                        'Test du dernier caractère pour voir s'il est égal à "'" + ajustement si nécessaire
                        If nvelleValeurTxtBoxCst(nvelleValeurTxtBoxCst.Length - 1) <> "'" Then nvelleValeurTxtBoxCst = nvelleValeurTxtBoxCst & "'"
                    End If
                    'Champs en sortie de type Double
                    If _correspConsultee.chOutil.getFormat.typeStock.Name = "Double" Then
                        'On teste le 1er caractère pour voir s'il est égal à "="
                        If Microsoft.VisualBasic.Left(nvelleValeurTxtBoxCst, 1) <> "=" Then nvelleValeurTxtBoxCst = "=" & nvelleValeurTxtBoxCst
                    End If


                Else
                    'Si le précédent masque valide n'était pas vide, on vérifie que sa syntaxe est toujours valide
                    If _correspConsultee.chOutil.getFormat.typeStock.Name = "String" Then
                        If (Microsoft.VisualBasic.Left(nvelleValeurTxtBoxCst, 2) <> "='" Or _
                            Microsoft.VisualBasic.Right(nvelleValeurTxtBoxCst, 1) <> "'" Or _
                            Len(nvelleValeurTxtBoxCst) < 3) Then
                            result = False
                        End If
                    End If
                    If _correspConsultee.chOutil.getFormat.typeStock.Name = "Double" Then
                        If (Microsoft.VisualBasic.Left(nvelleValeurTxtBoxCst, 1) <> "=") Then
                            result = False
                        End If
                    End If
                End If


                'On vérifie que la valeur en cours, hors formatage, est compatible avec le format
                'du champs cible
                If result Then
                    nvelleValeurCst = Microsoft.VisualBasic.Right(nvelleValeurTxtBoxCst, Len(nvelleValeurTxtBoxCst) - 2)
                    nvelleValeurCst = Microsoft.VisualBasic.Left(nvelleValeurCst, Len(nvelleValeurCst) - 1)
                    If _correspConsultee.chOutil.getFormat.typeStock.Name = "Double" And Not IsNumeric(nvelleValeurCst) Then
                        result = False
                    End If
                End If

                'Si le masque et la nouvelle valeur demandée pour la textBox sont valides
                'On met à jour :
                '   - la valeur de la textBox retraitée
                '   - la précédente valeur de la textBox
                '   - la position du curseur et la précédente position du curseur
                '   - la valeur du champs en entrée
                '   - l'affichage des contrôles
                '   - l'état de la correspondance
                If result Then
                    'Mise à jour de la valeur de la textBox
                    _txt_chConstant_TextChangedActive = False
                    Txt_chConstant.Text = nvelleValeurTxtBoxCst
                    _txt_chConstant_TextChangedActive = True
                    'Mise à jour de la position du curseur
                    If _txt_chConstant_DerniereValeurValide = "" Then
                        If _correspConsultee.chOutil.getFormat.typeStock.Name = "String" Then
                            Txt_chConstant.SelectionStart = Txt_chConstant.Text.Length - 1
                        Else
                            Txt_chConstant.SelectionStart = Txt_chConstant.Text.Length
                        End If
                    End If
                    'Mise à jour de la précédente valeur de la textBox
                    _txt_chConstant_DerniereValeurValide = nvelleValeurTxtBoxCst
                    'Mise à jour de la précédente valeur de la textBox
                    _txt_chConstant_DernierePosCurseurValide = Txt_chConstant.SelectionStart
                    'Mise à jour de la correspondance
                    _table.ListeChampsSortie.setFormuleEgaleCste(New ChampsBDD(nvelleValeurCst, _
                                        _correspConsultee.chOutil.getFormat.copy()), _
                                        _correspConsultee.description)
                    _correspConsultee.typeChEntree = typeChEntreeMapping.CONSTANT
                    'Mise à jour de l'affichage des contrôles
                    gbx_champsSource.Enabled = False
                    lbl_chSourceValeurs.Enabled = False
                    ltv_ValeursEncSce.Enabled = False
                Else
                    'Sinon, si la nouvelle valeur demandée pour la textBox n'est pas valide, on
                    'récupère l'ancienne version de la textBox et de la position du curseur
                    _txt_chConstant_TextChangedActive = False
                    Txt_chConstant.Text = _txt_chConstant_DerniereValeurValide
                    Txt_chConstant.SelectionStart = _txt_chConstant_DernierePosCurseurValide
                    _txt_chConstant_TextChangedActive = True
                End If
            Else
                'Si la nouvelle valeur de la textBox est vide
                _txt_chConstant_DerniereValeurValide = ""
                _txt_chConstant_DernierePosCurseurValide = 0
                If Not _chEntreeCorrespSAVE Is Nothing Then
                    _table.ListeChampsSortie.setFormuleEgaleCste(_chEntreeCorrespSAVE, _
                                        _correspConsultee.description)
                    _correspConsultee.typeChEntree = typeChEntreeMapping.CONSTANT
                Else
                    _table.ListeChampsSortie.setFormuleEgaleNothing(_correspConsultee.description)
                End If
                'Mise à jour de l'affichage des contrôles
                gbx_champsSource.Enabled = True
                lbl_chSourceValeurs.Enabled = True
                ltv_ValeursEncSce.Enabled = True
            End If

            btn_CouleurCorresp.BackColor = _correspConsultee.etat

            If _correspConsultee.commentaire <> "OK" Then
                Me.Height = 642
                lbl_RqCorresp.Visible = True
                lbl_RqCorresp_Text.Visible = True
                lbl_RqCorresp_Text.Text = _correspConsultee.commentaire
            Else
                Me.Height = 493
                lbl_RqCorresp.Visible = False
                lbl_RqCorresp_Text.Visible = False
            End If

        End If

    End Sub

    Private Sub Txt_chConstant_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Txt_chConstant.KeyUp
        precValeurCurseurTxtBox = Txt_chConstant.SelectionStart
    End Sub

    Private Sub Txt_chConstant_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Txt_chConstant.MouseClick
        precValeurCurseurTxtBox = Txt_chConstant.SelectionStart
    End Sub

#End Region


    Private Sub OK_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK_Button.Click
        Me.DialogResult = System.Windows.Forms.DialogResult.OK
        Me.Close()
    End Sub
    Private Sub Cancel_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel_Button.Click
        Me.DialogResult = System.Windows.Forms.DialogResult.Cancel
        Me.Close()
    End Sub

#End Region

End Class
